#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>


double funcaoRandomica() //Funcao randomica.. encontrar uma melhor
{

    double nRandom;

    nRandom = (double)rand()/RAND_MAX;

    return nRandom;

}

double standard_deviation(double *data, int M, double mean)//Funcao que calcula o desvio padrao
{
    double sum_deviation=0.0;
    int i;
    for(i=0; i<M;++i){//Aplica para cada indice do vetor trials
    sum_deviation+=(data[i]-mean)*(data[i]-mean);//Formula do desvio padrao
    }

    return sqrt(sum_deviation/M);//Retorna o desvio padrao
}

int main (int argc, char *argv[]){


    double S; //Valor da acao ( Asset value )
    double E; //preco de exercicio da opcao ( Exercise Price )
    double r; // taxa de juros ( Interest rate )
    double sigma; // volatilidade da acao ( Volatility )
    double T; //Tempo de validade da acao ( Expirity time )
    int M; //Numero de interacoes ( Number of trials )
    int i;
    double temp; //Variavel temporaria
    srand(time(NULL)); //Inicializa a funcao randomica


   scanf("%lf %lf %lf %lf %lf %i", &S, &E, &r, &sigma, &T, &M );


    //Apenas para facilitar
    // S = 100.0;
    // E = 110.0;
    // r = 10.0;
    // sigma = 1.0;
    // T = 1.0;
    // M = 10;

    printf("S %lf\nE %lf\nr %lf\nsigma %lf\nT%lf\nM %i\n", S,E,r,sigma,T,M);
    double trials[M]; //Vetor de iteracoes do metodo de Monte Carlo
    double maxNumber;//Guarda o maior valor entre zero e temp-E
    double soma = 0;
    double mean;//Media dos valores do vetor trials
    double intervaloConfianca;

    for ( i = 0; i < M; i++){

        //Calcula a primeira parte da formula de Black Scholes
        temp = (S*exp((r - (sigma*sigma)/2)*T + 
            (sigma*sqrt(T)*funcaoRandomica())));

        maxNumber = temp - E; //Verifica se temp - E e' maior que zero
        if (maxNumber < 0){
            maxNumber = 0;
        }


        //Calcula a segunda parte da formula e atribui o valor ao vetor de Monte Carlo
        trials[i] = (exp((-1*r)*T) * maxNumber);
        soma = soma + trials[i];


    }
    printf("Soma: %lf\n", soma);
    mean = soma / M;//Calcula a media dos valores do vetor trials
	intervaloConfianca = 1.96*(standard_deviation(trials, M, mean)/sqrt(M));//Chama a funcao de desvio padrao e aplica a ultima parte da formula

	printf("Confidence interval (%lf,%lf)\n", mean -intervaloConfianca, mean + intervaloConfianca);//Imprime o intervalo de confianca


     return 0;
}



